﻿Public Class Permisos

    Private oAdmin As New CAdmin
    Private dtPerfil As New DataTable
    Private dtMenu As New DataTable
    Private dtPermiso As New DataTable

    Private Sub Permisos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.CargarPerfiles()
    End Sub

    Private Sub CargarPerfiles()
        Try
            Dim ds As New DataSet
            ds = Me.oAdmin.GetPerfiles()
            Me.dtPerfil = ds.Tables(0).Copy
            If (Me.dtPerfil.Rows.Count > 0) Then
                Me.drpPerfil.DataSource = CUtil.AgregarRegistro(Me.dtPerfil, "Seleccione...")
                Me.drpPerfil.ValueMember = Me.dtPerfil.Columns(0).ColumnName
                Me.drpPerfil.DisplayMember = Me.dtPerfil.Columns(1).ColumnName
            Else
                Me.drpPerfil.DataSource = Nothing
                Me.drpPerfil.Items.Clear()
                Dim values(2) As String
                values(0) = "0"
                values(1) = "No existen perfiles creados"
                Me.drpPerfil.Items.Add(values)
                MessageBox.Show("No existen perfiles creados", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Catch ex As Exception
            MessageBox.Show("Ocurrió un error al cargar los perfiles: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub drpPerfil_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles drpPerfil.SelectionChangeCommitted
        '*** Trae los permisos actuales del perfil seleccionado
        Try
            If (CInt(Me.drpPerfil.SelectedValue) > 0) Then
                'Obtiene los valores del permiso para fact. aerea y maritima
                Dim aereo As Boolean = False
                Dim maritimo As Boolean = False
                Dim guias As Boolean = False
                For i As Integer = 0 To Me.dtPerfil.Rows.Count - 1
                    If (Me.dtPerfil.Rows(i)("ID").ToString = Me.drpPerfil.SelectedValue) Then
                        aereo = Me.dtPerfil.Rows(i)("AEREO")
                        maritimo = Me.dtPerfil.Rows(i)("MARITIMO")
                        guias = Me.dtPerfil.Rows(i)("GUIAS")
                    End If
                Next

                Me.chkAereo.Checked = False
                Me.chkMaritimo.Checked = False
                Me.chkGuias.Checked = False
                If (aereo) Then
                    Me.chkAereo.Checked = True
                End If
                If (maritimo) Then
                    Me.chkMaritimo.Checked = True
                End If
                If (guias) Then
                    Me.chkGuias.Checked = True
                End If

                'Trae el menu completo y el menu sobre el que el perfil seleccionado tiene permisos
                Dim ds As New DataSet
                ds = Me.oAdmin.GetPermisosPerfil(CInt(Me.drpPerfil.SelectedValue))
                Me.dtMenu = ds.Tables(0).Copy
                Me.dtPermiso = ds.Tables(1).Copy

                Me.PintarArboles()
            Else
                Me.Limpiar()
            End If
        Catch ex As Exception
            MessageBox.Show("Ocurrió un error al cargar los permisos del perfil seleccionado: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub Limpiar()
        Me.chkAereo.Checked = False
        Me.chkMaritimo.Checked = False
        Me.chkGuias.Checked = False
        Me.treeMenu.Nodes.Clear()
        Me.treePermisos.Nodes.Clear()
    End Sub


    Private Sub PintarArboles()
        Dim nodoPadre As TreeNode
        Me.treeMenu.Nodes.Clear()
        Me.treePermisos.Nodes.Clear()

        'Construye menu completo
        If (Me.dtMenu.Rows.Count > 0) Then
            For i As Integer = 0 To Me.dtMenu.Rows.Count - 1
                'Si el idpadre es cero es un nodo raiz
                If (CInt(Me.dtMenu.Rows(i)("IDPADRE")) = 0) Then
                    Me.treeMenu.Nodes.Add(Me.dtMenu.Rows(i)("ID").ToString, Me.dtMenu.Rows(i)("NOMBRE").ToString)
                    Me.treeMenu.Nodes(Me.treeMenu.Nodes.Count - 1).Tag = Me.dtMenu.Rows(i)("ID").ToString
                Else
                    'Se trata de un nodo hijo
                    nodoPadre = Me.treeMenu.Nodes.Item(Me.dtMenu.Rows(i)("IDPADRE").ToString)
                    nodoPadre.Nodes.Add(Me.dtMenu.Rows(i)("ID").ToString, Me.dtMenu.Rows(i)("NOMBRE").ToString)
                    nodoPadre.Nodes(nodoPadre.Nodes.Count - 1).Tag = Me.dtMenu.Rows(i)("ID").ToString
                End If
            Next
        End If

        'Construye menu de los permisos
        If (Me.dtPermiso.Rows.Count > 0) Then
            For i As Integer = 0 To Me.dtPermiso.Rows.Count - 1
                'Si el idpadre es cero es un nodo raiz
                If (CInt(Me.dtPermiso.Rows(i)("IDPADRE")) = 0) Then
                    Me.treePermisos.Nodes.Add(Me.dtPermiso.Rows(i)("ID").ToString, Me.dtPermiso.Rows(i)("NOMBRE").ToString)
                    Me.treePermisos.Nodes(Me.treePermisos.Nodes.Count - 1).Tag = Me.dtPermiso.Rows(i)("ID").ToString
                Else
                    'Se trata de un nodo hijo
                    nodoPadre = Me.treePermisos.Nodes.Item(Me.dtPermiso.Rows(i)("IDPADRE").ToString)
                    nodoPadre.Nodes.Add(Me.dtPermiso.Rows(i)("ID").ToString, Me.dtPermiso.Rows(i)("NOMBRE").ToString)
                    nodoPadre.Nodes(nodoPadre.Nodes.Count - 1).Tag = Me.dtPermiso.Rows(i)("ID").ToString
                End If
            Next
        End If

        'Expande los dos menus
        Me.treeMenu.ExpandAll()
        Me.treePermisos.ExpandAll()
    End Sub

    Private Sub btnDerecha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDerecha.Click
        'Busca el id del nodo seleccionado        
        If (Me.treeMenu.SelectedNode IsNot Nothing) Then
            Dim idMenu As Integer = CInt(Me.treeMenu.SelectedNode.Tag)

            Me.dtMenu.PrimaryKey = New DataColumn() {Me.dtMenu.Columns(0)}
            Me.dtPermiso.PrimaryKey = New DataColumn() {Me.dtPermiso.Columns(0)}

            'Busca el menu seleccionado en la tabla menu y lo agrega a la otra tabla, siempre y cuando no exista 
            'ya en la otra tabla
            Dim dr As DataRow
            Dim drNueva As DataRow = Me.dtPermiso.NewRow
            dr = Me.dtMenu.Rows.Find(idMenu)
            Dim nombreMenu = dr(2)

            If (Me.dtPermiso.Rows.Find(idMenu) Is Nothing) Then
                'Si el nodo es un nodo hijo, se comprueba que ya tiene permisos sobre le menu padre
                If (CInt(dr("IDPADRE")) <> 0) Then
                    If (Me.dtPermiso.Rows.Find(CInt(dr("IDPADRE"))) Is Nothing) Then
                        MessageBox.Show("Para poder darle permisos sobre este menú necesita darle permisos sobre el menú principal", "Permisos", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        Return
                    End If
                End If

                drNueva(0) = dr("ID")
                drNueva(1) = dr("IDPADRE")
                drNueva(2) = dr("NOMBRE")
                Me.dtPermiso.Rows.Add(drNueva)

                'Se ordena la tabla de los permisos por el idPadre        
                Dim dw As New DataView(Me.dtPermiso)
                dw.Sort = "IDPADRE"
                Me.dtPermiso = dw.ToTable

                'Se pintan de nuevo los arboles
                Me.PintarArboles()
            Else
                MessageBox.Show("El perfil seleccionado ya tiene permisos para entrar a '" & nombreMenu & "'", "Ya tiene permisos", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End If
    End Sub

    Private Sub btnIzquierda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIzquierda.Click
        'Encuentra el id del nodo seleccionado y lo elimina de la tabla de los permisos                
        Dim idNodoPadre As Integer = 0
        If (Me.treePermisos.SelectedNode IsNot Nothing) Then
            For i As Integer = 0 To Me.dtPermiso.Rows.Count - 1
                If (CInt(Me.dtPermiso.Rows(i)("ID")) = CInt(Me.treePermisos.SelectedNode.Tag)) Then
                    'Si el nodo es un nodo padre, se solicita que se eliminen primero los nodos hijos
                    If (CInt(Me.dtPermiso.Rows(i)("IDPADRE")) = 0) Then
                        idNodoPadre = CInt(Me.dtPermiso.Rows(i)("ID"))
                    End If
                    Me.dtPermiso.Rows.RemoveAt(i)
                    Exit For
                End If
            Next

            'Si se elimino un nodo padre, se eliminan los hijos tambien
            If (idNodoPadre <> 0) Then
                For i As Integer = Me.dtPermiso.Rows.Count - 1 To 0 Step -1
                    If (CInt(Me.dtPermiso.Rows(i)("IDPADRE")) = idNodoPadre) Then
                        Me.dtPermiso.Rows.RemoveAt(i)
                    End If
                Next
            End If
            Me.dtPermiso.AcceptChanges()

            'Se pintan de nuevo los arboles
            Me.PintarArboles()
        End If
    End Sub

    Private Sub btnListo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListo.Click
        If (Me.Validar()) Then
            Try
                Cursor = Cursors.WaitCursor
                'Guarda los menus permiso en una variable
                Dim menus As String = ""
                For i As Integer = 0 To Me.dtPermiso.Rows.Count - 1
                    'Guarda los ids seleccionados                    
                    menus = menus & Me.dtPermiso.Rows(i)("ID").ToString & ","
                Next
                'Quita la ultima coma
                If (menus.Length > 0) Then
                    menus = menus.Substring(0, menus.Length - 1)
                End If

                Dim aereo As Integer = 0
                Dim maritimo As Integer = 0
                Dim guias As Integer = 0
                If (Me.chkAereo.Checked) Then
                    aereo = 1
                End If
                If (Me.chkMaritimo.Checked) Then
                    maritimo = 1
                End If
                If (Me.chkGuias.Checked) Then
                    guias = 1
                End If

                Me.oAdmin.ActualizarPermisos(CInt(Me.drpPerfil.SelectedValue), aereo, maritimo, guias, menus)
                Cursor = Cursors.Default

                MessageBox.Show("Los permisos han sido editados", "Permisos", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                Cursor = Cursors.Default
                MessageBox.Show("Ocurrió un error al guardar los datos del usuario: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try
            If (Me.drpPerfil.Items.Count > 0) Then
                Me.drpPerfil.SelectedIndex = 0
            End If
        End If
    End Sub

    Private Function Validar() As Boolean
        'Debe haberse seleccionado algun perfil
        Dim mensaje As String = ""

        If (Me.drpPerfil.SelectedValue = "0") Then
            mensaje += "- Debe seleccionar el perfil al que desea modificar los permisos" & Chr(13)
        End If
        If (Me.dtPermiso.Rows.Count = 0) Then
            mensaje += "- El perfil no puede quedar sin permisos" & Chr(13)
        End If

        If (mensaje.Length > 0) Then
            MessageBox.Show(mensaje, "Datos incompletos", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return False
        Else
            Return True
        End If
    End Function

End Class